/**
 *  启动自定义
 *  这里可以提供一些全局的项目生命周期的hooks供项目初始化使用
 */
import { join } from "path";
import { Application, IBoot } from "egg";
export default class AppIboot implements IBoot {
  private readonly app: Application;
  constructor(app: Application) {
    this.app = app;
  }
  // 这是一个同步执行的生命周期函数
  configWillLoad() {
    // 在这个生命周期中，config已经被读取，但是还未生效，
    // 因此这是应用层修改配置的最好时机
    // console.log("??????????? configWillLoad");
    // 在项目初始化阶段就启动错误统一处理中间件，这样才能捕捉到其他后续执行的中间件抛出的异常
    this.app.config.coreMiddleware.unshift("customError");
  }
  // 这是一个异步执行的hooks
  async willReady() {
    // console.log("??????????? willReady");
  }
  async didReady() {
    // console.log("??????????? didReady", this.app.middleware);
    // 自定义挂载数据模型model到app对象上，跟加载controller一样，需要使用到加载器
    // 最终的转换方式：app/model/user.ts ==> app.model.User
    const dir = join(this.app.config.baseDir, "app/validate");
    // console.log("??????????? middleware", this.app.config.coreMiddleware);
    this.app.loader.loadToApp(dir, "validate");
  }
}
